home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 1 / PCU0103CD1.iso / entertn / demos / files / aomtrial.exe / AOM / AI / SCN35P4.XS < prev    next >
Encoding:
Text File  |  2002-09-10  |  19.2 KB  |  523 lines

  1. //==============================================================================
  2. // Scn35p4: AI Scenario Script for scenario 35 player 4
  3. //==============================================================================
  4. /*
  5.    AI owner:  Dave Leary
  6.    Scenario owner: Joe Gillum
  7.  
  8.    Basic AI to do some basic maintaining for the HP's Egyptian ally in the final 
  9.     scenario.
  10.         
  11. */
  12. //==============================================================================
  13. // Variable for main base.
  14. int gMainBaseID=-1;
  15.  
  16. //==============================================================================
  17. // Set Town Location
  18. //==============================================================================
  19. void setTownLocation(void)
  20. {
  21.    //Look for the "Town Location" marker.
  22.    kbSetTownLocation(kbGetBlockPosition("2928"));
  23. }
  24.  
  25. //==============================================================================
  26. // miscStartup
  27. //==============================================================================
  28. void miscStartup(void)
  29. {
  30.     // Difficulty Level check.
  31.     int difflevel=-1;        
  32.     difflevel=aiGetWorldDifficulty();
  33.  
  34.    //Startup message(s).
  35.    aiEcho("");
  36.    aiEcho("");
  37.    aiEcho("Scn35P4 AI Start, filename='"+cFilename+"'.");
  38.     aiEcho("Difficulty Level="+difflevel+".");
  39.    //Spit out the map size.
  40.    aiEcho("  Map size is ("+kbGetMapXSize()+", "+kbGetMapZSize()+").");
  41.    //Cheat like a bastard.  Once only, though.
  42.    kbLookAtAllUnitsOnMap();
  43.    //Calculate some areas.
  44.    kbAreaCalculate(1200.0);
  45.    //Set our town location.
  46.    setTownLocation();
  47.     //Reset random seed
  48.     aiRandSetSeed();
  49.  
  50.     //Set the base location.
  51.     gMainBaseID=kbBaseGetMainID(cMyID);
  52. }
  53.  
  54. //==============================================================================
  55. //==============================================================================
  56. // Attack stuff.
  57. //==============================================================================
  58. //==============================================================================
  59. //Shared variables.
  60. int numberAttacks=0;
  61. int attackPlayerID=-1;
  62.  
  63. //TODO: Decide how to rep attack group size.
  64. int attackMinimumGroupSize=3;
  65. int attackMaximumGroupSize=5;
  66.  
  67. //Attack 1 vars.
  68. int attackPlan1ID=-1;
  69.  
  70. //Attack 2 vars.
  71. int attackPlan2ID=-1;
  72.  
  73. // Route and path vars
  74. int attackRoute1ID=-1;
  75. int attackPath1ID=-1;
  76. int attackRoute2ID=-1;
  77. int attackPath2ID=-1;
  78.  
  79. // Saved plan IDs
  80. int maintainPlan1ID=-1;
  81. int maintainPlan2ID=-1;
  82. int maintainPlan3ID=-1;
  83. int maintainPlan4ID=-1;
  84.  
  85. // Unit types
  86. int attackerUnitTypeID1=cUnitTypeAxeman;
  87.  
  88. // Initial gather percentages
  89. float totalFoodGathererPercentage  = 0.6;
  90. float totalWoodGathererPercentage  = 0.4;
  91. float totalGoldGathererPercentage  = 0.0;
  92. float totalFavorGathererPercentage = 0.0;
  93.  
  94.  
  95. //==============================================================================
  96. // initEcon
  97. //
  98. // Set Up the initial Econonomy.
  99. //==============================================================================
  100. void initEcon()
  101. {
  102.    aiEcho("Economy Init.");
  103.  
  104.     /* Don't need this for what we're doing here.
  105.    // Set our update resource handler.
  106.    aiSetUpdateResourceEventHandler("updateResourceHandler");
  107.     */
  108.  
  109.    //-- Setup AI Cost weights.
  110.    kbSetAICostWeight(cResourceFood, 1.5);
  111.    kbSetAICostWeight(cResourceWood, 1.0);
  112.    kbSetAICostWeight(cResourceGold, 1.5);
  113.    kbSetAICostWeight(cResourceFavor, 10.0);
  114.  
  115.    //-- Dont auto gather favor
  116.    //totalFavorGathererPercentage = 0;
  117.  
  118.    //-- Set initial gatherer percentages.
  119.    aiSetResourceGathererPercentage(cResourceFood, totalFoodGathererPercentage, false, cRGPScript);
  120.    aiSetResourceGathererPercentage(cResourceWood, totalWoodGathererPercentage, false, cRGPScript);
  121.    aiSetResourceGathererPercentage(cResourceGold, totalGoldGathererPercentage, false, cRGPScript);
  122.    aiSetResourceGathererPercentage(cResourceFavor, totalFavorGathererPercentage, false, cRGPScript);
  123.    aiNormalizeResourceGathererPercentages(cRGPScript);
  124.  
  125.    //-- Set up the initial resource subtype break downs.
  126.     // aiSetResourceBreakdown(cResourceFood, cAIResourceSubTypeEasy, 1, 50, 0.9, gMainBaseID);
  127.     // aiSetResourceBreakdown(cResourceFood, cAIResourceSubTypeHunt, 1, 50, 0.1, gMainBaseID);
  128.     aiSetResourceBreakdown(cResourceFood, cAIResourceSubTypeFarm, 1, 50, 1.0, gMainBaseID);
  129.     aiSetResourceBreakdown(cResourceWood, cAIResourceSubTypeEasy, 1, 50, 1.0, gMainBaseID);
  130.     aiSetResourceBreakdown(cResourceGold, cAIResourceSubTypeEasy, 1, 50, 1.0, gMainBaseID);
  131.    aiSetResourceBreakdown(cResourceFavor, cAIResourceSubTypeEasy, 1, 50, 1.0, gMainBaseID);
  132.     
  133.    //-- Set up auto-gather escrows
  134.    aiSetAutoGatherEscrowID(cRootEscrowID);
  135.    aiSetAutoFarmEscrowID(cRootEscrowID);
  136.  
  137.     //Allocate all resources to the root escrow by setting percentage of military/economy to 0.
  138.     kbEscrowSetPercentage( cEconomyEscrowID, cAllResources, 0.0 );
  139.     kbEscrowSetPercentage( cMilitaryEscrowID, cAllResources, 0.0 );
  140.  
  141.     //-- create a herd plan to gather all herdables that we ecounter.
  142.     /*
  143.    int herdPlanID=aiPlanCreate("HerdTest", cPlanHerd);
  144.    if (herdPlanID >= 0)
  145.    {
  146.       aiPlanAddUnitType(herdPlanID, cUnitTypeHerdable, 0, 100, 100);
  147.       aiPlanSetVariableInt(herdPlanID, cHerdPlanBuildingTypeID, 0, cUnitTypeSettlementLevel1);
  148.       aiPlanSetActive(herdPlanID);
  149.    }
  150.     */
  151.  
  152.     //Allocate all resources
  153.    kbEscrowAllocateCurrentResources();
  154. }
  155.  
  156. //==============================================================================
  157. // initAttack: Creates attack routes, etc.
  158. //==============================================================================
  159. void initAttack(int playerID=-1)
  160. {
  161.    //Destroy all previous attacks (if this isn't the player we're already attacking.
  162.    if (playerID != attackPlayerID)
  163.    {
  164.       //Reset the attack player ID.
  165.       attackPlayerID=-1;
  166.       //Destroy any previous attack plan.
  167.       aiPlanDestroy(attackPlan1ID);
  168.       attackPlan1ID=-1;
  169.       aiPlanDestroy(attackPlan2ID);
  170.       attackPlan2ID=-1;
  171.   
  172.       //Destroy our previous attack paths.
  173.       kbPathDestroy(attackPath1ID);
  174.       attackPath1ID=-1;
  175.       kbPathDestroy(attackPath2ID);
  176.       attackPath2ID=-1;
  177.  
  178.       //Destroy our previous attack routes.
  179.       attackRoute1ID=-1;
  180.       attackRoute2ID=-1;
  181.  
  182.       //Reset the number of attacks.
  183.       numberAttacks=0;
  184.    }
  185.  
  186.    //Save the player to attack.
  187.    attackPlayerID=playerID;
  188.  
  189.     /*
  190.  
  191.    vector gatherPoint=kbGetBlockPosition("3102");
  192.        
  193.     //Setup attack path 1 - go left
  194.    attackPath1ID=kbPathCreate("Attack Path 1");
  195.    kbPathAddWaypoint(attackPath1ID, kbGetBlockPosition("3990"));
  196.     kbPathAddWaypoint(attackPath1ID, kbGetBlockPosition("3991"));
  197.     kbPathAddWaypoint(attackPath1ID, kbGetBlockPosition("3992"));
  198.    //Create attack route 1.
  199.    attackRoute1ID=kbCreateAttackRouteWithPath("Attack Route 1", gatherPoint, kbGetBlockPosition("3995"));
  200.    
  201.     if (attackRoute1ID >= 0)
  202.       kbAttackRouteAddPath(attackRoute1ID, attackPath1ID);
  203.  
  204.    //Setup attack path 2 - go right
  205.    attackPath2ID=kbPathCreate("Attack Path 2");
  206.    kbPathAddWaypoint(attackPath2ID, kbGetBlockPosition("3990"));
  207.     kbPathAddWaypoint(attackPath2ID, kbGetBlockPosition("3991"));
  208.     kbPathAddWaypoint(attackPath2ID, kbGetBlockPosition("3993"));
  209.     kbPathAddWaypoint(attackPath2ID, kbGetBlockPosition("3994"));
  210.    //Create attack route 2.
  211.    attackRoute2ID=kbCreateAttackRouteWithPath("Attack Route 2", gatherPoint, kbGetBlockPosition("3995"));
  212.    
  213.     if (attackRoute2ID >= 0)
  214.       kbAttackRouteAddPath(attackRoute2ID, attackPath2ID);
  215.     */
  216. }
  217.  
  218. //==============================================================================
  219. // setupAttack
  220. //==============================================================================
  221. bool setupAttack(int playerID=-1)
  222. {
  223.    
  224.     //Info.
  225.     aiEcho("Attacking Player "+playerID+".");
  226.  
  227.    //If the player to attack doesn't match, init the attack.
  228.    if (attackPlayerID != playerID)
  229.    {
  230.       initAttack(playerID);
  231.       if (attackPlayerID < 0)
  232.          return(false);
  233.    }
  234.  
  235.    //Create an attack plan.
  236.    int newAttackPlanID=aiPlanCreate("Attack Player"+attackPlayerID+" Attempt"+numberAttacks, cPlanAttack);
  237.    if (newAttackPlanID < 0)
  238.       return(false);
  239.  
  240.    //Target player (required).  This must work.
  241.    if (aiPlanSetVariableInt(newAttackPlanID, cAttackPlanPlayerID, 0, attackPlayerID) == false)
  242.       return(false);
  243.  
  244.    //Gather point.
  245.     vector gatherPoint=kbGetBlockPosition("3127");
  246.  
  247.     //Set the target type.  This must work.
  248.    if (aiPlanSetNumberVariableValues(newAttackPlanID, cAttackPlanTargetTypeID, 2, true) == false)
  249.       return(false);
  250.  
  251.    //Unit types to attack.
  252.    aiPlanSetVariableInt(newAttackPlanID, cAttackPlanTargetTypeID, 0, cUnitTypeUnit);
  253.     aiPlanSetVariableInt(newAttackPlanID, cAttackPlanTargetTypeID, 1, cUnitTypeBuilding);
  254.  
  255.    //Attack route.
  256.     /*
  257.    if (randomPath == 0)
  258.     {
  259.       aiPlanSetVariableInt(newAttackPlanID, cAttackPlanAttackRouteID, 0, attackRoute1ID);
  260.     }
  261.    else
  262.     {
  263.       aiPlanSetVariableInt(newAttackPlanID, cAttackPlanAttackRouteID, 0, attackRoute2ID);
  264.     }
  265.     */
  266.  
  267.    //Set the gather point and gather point distance.
  268.    aiPlanSetVariableVector(newAttackPlanID, cAttackPlanGatherPoint, 0, gatherPoint);
  269.    aiPlanSetVariableFloat(newAttackPlanID, cAttackPlanGatherDistance, 0, 40.0);
  270.  
  271.    //Set up the attack route usage pattern.
  272.    aiPlanSetVariableInt(newAttackPlanID, cAttackPlanAttackRoutePattern, 0, cAttackPlanAttackRoutePatternRandom);
  273.    
  274.     //Add the unit types to the plan - cav...
  275.    //aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID3, 4, 4, 8);
  276.     //...and ulfsarks...
  277.     //aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID2, 0, 2, 6);
  278.     // ...and a single mountain giant, if available.
  279.     //aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID4, 0, 1, 1);
  280.     
  281.    //Set the initial position.
  282.    aiPlanSetInitialPosition(newAttackPlanID, gatherPoint);
  283.    //Plan requires all need units to work (can be false).
  284.    aiPlanSetRequiresAllNeedUnits(newAttackPlanID, true);
  285.    //Activate the plan.
  286.    aiPlanSetActive(newAttackPlanID);
  287.  
  288.    //Now, save the attack plan ID appropriately.
  289.    aiPlanSetOrphan(attackPlan1ID, true);
  290.    attackPlan1ID=newAttackPlanID;
  291.  
  292.    //Increment our overall number of attacks.
  293.    numberAttacks++;
  294. }
  295.  
  296. //==============================================================================
  297. // createUnitProgression
  298. //==============================================================================
  299. int createUnitProgression(int unitTypeID=-1, string name="BUG")
  300. {
  301.    int pID=aiPlanCreate(name, cPlanProgression);
  302.    
  303.     if (pID < 0)
  304.       return(-1);
  305.  
  306.    //This is a military plan.
  307.    //aiPlanSetMilitary(pID, true);
  308.    //Set it for the building that we get our unit from.
  309.    aiPlanSetVariableInt(pID, cProgressionPlanGoalUnitID, 0, kbTechTreeGetUnitIDByTrain(unitTypeID));
  310.    
  311.     //Build it in our main base using the root escrow.
  312.     aiPlanSetBaseID(pID, gMainBaseID);
  313.     aiPlanSetEscrowID(pID, cRootEscrowID);
  314.    
  315.     //Go.
  316.    aiPlanSetActive(pID);
  317.    return(pID);
  318. }
  319.  
  320. //==============================================================================
  321. // createTechProgression
  322. //==============================================================================
  323. int createTechProgression(int techID=-1, string name="BUG", int researchFromProto=-1)
  324. {
  325.    //Check for old plan.
  326.     int oldPlanID=aiPlanGetIDByTypeAndVariableType(cPlanProgression, cProgressionPlanGoalTechID, techID);
  327.    if(oldPlanID != -1)
  328.    {
  329.       aiEcho("createTechProgression: already have a plan("+oldPlanID+") for this Tech("+techID+").");
  330.       return(oldPlanID);
  331.    }
  332.    
  333.     //Create a new one.
  334.    int pID=aiPlanCreate(name, cPlanProgression);
  335.    if (pID < 0)
  336.    {
  337.       aiEcho("createTechProgression: couldn't create Progression.");
  338.       return(-1);
  339.    }
  340.    //This is a military plan.
  341.    //aiPlanSetMilitary(pID, true);
  342.    aiPlanSetVariableInt(pID, cProgressionPlanGoalTechID, 0, techID);
  343.    aiPlanSetVariableInt(pID, cProgressionPlanBuildingPref, 0, researchFromProto);
  344.    
  345.     //Build it in our main base using the root escrow.
  346.    aiPlanSetBaseID(pID, gMainBaseID);
  347.     aiPlanSetEscrowID(pID, cRootEscrowID);
  348.  
  349.    //Go.
  350.    aiPlanSetActive(pID);
  351.    aiEcho("createTechProgression: creating Tech Progression("+name+") to TechID("+techID+").");
  352.    return(pID);
  353. }
  354.  
  355. //==============================================================================
  356. // Attack Generator 1 - Send dudes now!  Or, well, soon.
  357. //==============================================================================
  358. /*
  359. rule attackGenerator1
  360.    minInterval 90
  361.    inactive
  362.    group AttackRules
  363. {
  364.    //See how many "idle" attack plans we have.  Don't create any more if we have
  365.    //idle plans.
  366.    int numberIdleAttackPlans=aiGetNumberIdlePlans(cPlanAttack);
  367.  
  368.    if (numberIdleAttackPlans > 0)
  369.       return;
  370.  
  371.    //If we have enough unassigned military units, create a new attack plan.
  372.    int numberAvailableUnits=aiNumberUnassignedUnits(attackerUnitTypeID3);
  373.    aiEcho("There are "+numberAvailableUnits+" raiding cav available for a new attack.");
  374.    
  375.     if (numberAvailableUnits >= 4)
  376.         setupAttack(1);
  377. }
  378. */
  379.  
  380. //==============================================================================
  381. // longhouseBuilt - called with an AI FUNC when he has one longhouse.
  382. //==============================================================================
  383. /*
  384. void longhouseBuilt( int parameter=-1 )
  385. {
  386.     vector gatherPointCavalry=kbGetBlockPosition("3126");
  387.  
  388.     //Maintain raiding cavalry.  Up to eight.
  389.    maintainPlan3ID=aiPlanCreate("Maintain 8 "+kbGetProtoUnitName(attackerUnitTypeID3), cPlanTrain);
  390.    if (maintainPlan3ID >= 0)
  391.    {
  392.         //Must set the type of unit to train.
  393.       aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanUnitType, 0, attackerUnitTypeID3);
  394.       //Set the number of units to maintain in the world at one time.
  395.       aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanNumberToMaintain, 0, 8);
  396.       //Don't train units faster than every 20 seconds
  397.       aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanFrequency, 0, 20);
  398.       //Set a gather point.
  399.       aiPlanSetVariableVector(maintainPlan3ID, cTrainPlanGatherPoint, 0, gatherPointCavalry);
  400.       //Activate the plan.
  401.       aiPlanSetActive(maintainPlan3ID);
  402.    }
  403.  
  404.     // Time for lots more villagers.
  405.     aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanNumberToMaintain, 0, 30);
  406.     
  407.     // Time for more ulfsarks.  Maintain ten now.
  408.     aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanNumberToMaintain, 0, 10);
  409.  
  410.     // Change percentage of who's on what.
  411.    aiSetResourceGathererPercentage(cResourceFood, 0.6, false, cRGPScript);
  412.    aiSetResourceGathererPercentage(cResourceWood, 0.1, false, cRGPScript);
  413.    aiSetResourceGathererPercentage(cResourceGold, 0.3, false, cRGPScript);
  414.     aiNormalizeResourceGathererPercentages(cRGPScript);
  415.    
  416.     // Food resource breakdown now changes to almost entirely farms.
  417.     aiSetResourceBreakdown(cResourceFood, cAIResourceSubTypeEasy, 1, 10, 0.2, gMainBaseID);
  418.     aiSetResourceBreakdown(cResourceFood, cAIResourceSubTypeHunt, 1, 10, 0.1, gMainBaseID);
  419.     aiSetResourceBreakdown(cResourceFood, cAIResourceSubTypeFarm, 1, 50, 0.7, gMainBaseID);
  420.  
  421.     // Research some techs.
  422.     createTechProgression(cTechHeavyInfantry, "Research Heavy Infantry", cUnitTypeLonghouse);
  423.     createTechProgression(cTechHeavyCavalry, "Research Heavy Cavalry", cUnitTypeLonghouse);
  424.     createTechProgression(cTechIrrigation, "Research Plow", cUnitTypeOxCart);
  425.  
  426.     // Progress to Huskarls - kind of a hack, used to get him to build a hill fort.
  427.     createUnitProgression(cUnitTypeHuskarl, "Progression to Huskarls");
  428.  
  429.     // Activate attacks.  Time to beat up on the player.
  430.     xsEnableRule("attackGenerator1");
  431. }
  432.  
  433. //==============================================================================
  434. // hillFortBuilt - called with an AI FUNC when he has one hill fort.
  435. //==============================================================================
  436. void hillFortBuilt( int parameter=-1 )
  437. {
  438.     vector gatherPointGiants=kbGetBlockPosition("3125");
  439.  
  440.     //Maintain a single mountain giant.  Adds to the fun.  :)
  441.    maintainPlan4ID=aiPlanCreate("Maintain 1 "+kbGetProtoUnitName(attackerUnitTypeID4), cPlanTrain);
  442.    if (maintainPlan4ID >= 0)
  443.    {
  444.         //Must set the type of unit to train.
  445.       aiPlanSetVariableInt(maintainPlan4ID, cTrainPlanUnitType, 0, attackerUnitTypeID4);
  446.       //Set the number of units to maintain in the world at one time.
  447.       aiPlanSetVariableInt(maintainPlan4ID, cTrainPlanNumberToMaintain, 0, 1);
  448.       //Don't train units faster than every 60 seconds
  449.       aiPlanSetVariableInt(maintainPlan4ID, cTrainPlanFrequency, 0, 60);
  450.       //Set a gather point.
  451.       aiPlanSetVariableVector(maintainPlan4ID, cTrainPlanGatherPoint, 0, gatherPointGiants);
  452.       //Activate the plan.
  453.       aiPlanSetActive(maintainPlan4ID);
  454.    }
  455.  
  456.     // Change percentage of who's on what.
  457.    aiSetResourceGathererPercentage(cResourceFood, 0.5, false, cRGPScript);
  458.    aiSetResourceGathererPercentage(cResourceWood, 0.1, false, cRGPScript);
  459.    aiSetResourceGathererPercentage(cResourceGold, 0.4, false, cRGPScript);
  460. }
  461. */
  462.  
  463. //==============================================================================
  464. // MAIN. 
  465. //==============================================================================
  466. void main(void)
  467. {
  468.    //Startup.
  469.    miscStartup();
  470.     initEcon();
  471.  
  472.    //Share a common gather point.
  473.    vector gatherPointMilitary=kbGetBlockPosition("2937");
  474.  
  475.     
  476.    //Maintain villagers.  Fifteen should do it.
  477.     /*
  478.    maintainPlan1ID=aiPlanCreate("Maintain 15 "+kbGetProtoUnitName(attackerUnitTypeID1), cPlanTrain);
  479.    if (maintainPlan1ID >= 0)
  480.    {
  481.         //Must set the type of unit to train.
  482.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanUnitType, 0, attackerUnitTypeID1);
  483.       //You can limit the number of units that are ever trained by this plan with this call.
  484.       //aiPlanSetVariableInt(maintainPlanID, cTrainPlanNumberToTrain, 0, 25);
  485.       //Set the number of units to maintain in the world at one time.
  486.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanNumberToMaintain, 0, 12);
  487.       //Don't train units faster than every 15 seconds
  488.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanFrequency, 0, 15);
  489.       //Set a gather point.
  490.       aiPlanSetVariableVector(maintainPlan1ID, cTrainPlanGatherPoint, 0, gatherPointVillager);
  491.       //Activate the plan.
  492.       aiPlanSetActive(maintainPlan1ID);
  493.    }
  494.     */
  495.  
  496.     //Maintain axemen!
  497.    maintainPlan2ID=aiPlanCreate("Maintain 5 "+kbGetProtoUnitName(attackerUnitTypeID1), cPlanTrain);
  498.    if (maintainPlan2ID >= 0)
  499.    {
  500.         //Must set the type of unit to train.
  501.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanUnitType, 0, attackerUnitTypeID1);
  502.       //You can limit the number of units that are ever trained by this plan with this call.
  503.       //aiPlanSetVariableInt(maintainPlanID, cTrainPlanNumberToTrain, 0, 25);
  504.       //Set the number of units to maintain in the world at one time.
  505.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanNumberToMaintain, 0, 8);
  506.       //Don't train units faster than every 45 seconds 
  507.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanFrequency, 0, 45);
  508.       //Set a gather point.
  509.       aiPlanSetVariableVector(maintainPlan2ID, cTrainPlanGatherPoint, 0, gatherPointMilitary);
  510.       //Activate the plan.
  511.       aiPlanSetActive(maintainPlan2ID);
  512.    }
  513.  
  514.     /*
  515.     int exploreID1 = aiPlanCreate("Explore 1", cPlanExplore);
  516.     if(exploreID1 >= 0)
  517.    {
  518.       aiPlanAddUnitType(exploreID1, cUnitTypeAxeman, 1, 1, 1);
  519.       aiPlanSetActive(exploreID1);
  520.    }
  521.     */
  522. }
  523.